package com.yesep.learn.design.creational.builder;

import com.yesep.learn.design.common.pojo.*;

/**
 * 建造者模式（Builder Pattern），也被称为生成器模式，是一种创建型设计模式。其核心思想是将一个复杂对象的构建与表示分离，使得同样的构建过程可以创建不同的表示。
 * 通过这种方式，用户只需要指定复杂对象的类型就可以得到该对象，而无须知道其内部的具体构造细节。
 * <p>
 * 一、定义与概述
 * 建造者模式将一个复杂对象的构建与它的表示分离，使得同样的构建过程可以创建不同的表示。用户只需要指定需要构建的类型就可以得到它们，而不需要知道内部的具体构建细节。
 * 建造者模式主要用于“分步骤构建”一个复杂的对象。在这个过程中，“指挥者”类（Director）负责安排复杂对象的建造次序，而具体的建造工作由不同的“建造者”类（Builder）来完成。
 * <p>
 * 二、角色与结构
 * 建造者模式主要包含以下几个角色：
 * <p>
 * 产品类（Product）：它是被构建的复杂对象，包含多个组成部件的类（例如，一辆汽车可能包含车轮、发动机等部件）。
 * 抽象建造者类（Builder）：它定义了一个接口，用于创建产品对象的各个部分。这个接口规定了产品对象的哪些部分需要被创建，但并不涉及具体的部件对象的创建。
 * 具体建造者类（ConcreteBuilder）：它实现了Builder接口，完成复杂产品的各个部件的具体创建方法。在构造过程完成后，提供一个方法，返回创建好的负责产品对象。
 * 指挥者类（Director）：它调用具体建造者来创建复杂对象的各个部分，在指导者中不涉及具体产品的信息，只负责保证对象各部分完整创建或按某种顺序创建。客户端一般只需要与指挥者进行交互。
 * 三、应用场景
 * 建造者模式适用于以下场景：
 * <p>
 * 创建复杂对象的算法独立于组成对象的部件：例如，建房子时，不管建什么房子，都离不开地基、柱子、层面和墙体等组成部分，建筑工人就是把这些组成部分一个个建起来，最后连成一体建出一栋栋楼房。
 * 客户端不必知道产品内部组成的细节：将产品本身与产品的创建过程解耦，使得相同的创建过程可以创建不同的产品对象。
 * 需要更加精细地控制产品的创建过程：将复杂产品的创建步骤分解在不同的方法中，使得创建过程更加清晰，也更方便使用程序来控制创建过程。
 * 四、优缺点
 * 优点
 * 封装性好：创建和使用分离，用户只需要知道产品的类型和如何获取产品，而不需要知道产品的具体创建过程。
 * 扩展性好：建造类之间独立，一定程度上解耦，可以方便地替换具体建造者或增加新的具体建造者，用户使用不同的具体建造者即可得到不同的产品对象。
 * 缺点
 * 可能产生多余的Builder对象：如果创建的产品数量较少，而Builder的创建过程又比较复杂，那么可能会产生不必要的开销。
 * 产品内部发生变化时，建造者可能都需要修改：这可能会增加维护成本。
 * 五、与工厂模式的区别
 * 建造者模式和工厂模式都是创建型设计模式，但它们在关注点、创建对象的力度和方法的调用顺序等方面存在差异。
 * 工厂模式注重于创建对象，而建造者模式则更加注重方法的调用顺序和对象的构建过程。
 * 此外，工厂模式通常用于创建简单对象，而建造者模式则更适用于创建复杂对象。
 * <p>
 * 综上所述，建造者模式是一种强大的设计模式，它通过将复杂对象的构建与表示分离，提供了高度的灵活性和可扩展性。
 * 在实际开发中，可以根据具体需求选择是否使用建造者模式来构建复杂对象。
 */
public class Main {
    public static void main(String[] args) {
        // 指挥者传入不同建造者即可建造同一复杂产品的不同组合
        Director hpDirector = new Director(new HPComputerBuilder());
        Computer computer = hpDirector.constructComputer();
        System.out.println(computer.toString());
        Director dellDirector = new Director(new DELLComputerBuilder());
        computer = dellDirector.constructComputer();
        System.out.println(computer.toString());
    }
}
